package com.lzw.DailyAudit.service.dateAggregation_02.DailyAudit.service.dealSourceData_01;


import com.hooya.fa.eu.biz.DailyAudit.entity.dto.kcjlDataDTO;
import com.hooya.fa.eu.biz.DailyAudit.mapper.DailyTempKcjlDailyHyMapper;
import com.hooya.fa.eu.biz.DailyAudit.mapper.DailyTempKcjlDailyMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@Slf4j
public class Post_Test {

    @Autowired
    private DailyTempKcjlDailyHyMapper tempKcjlDailyHyMapper;

    @Autowired
    private DailyTempKcjlDailyMapper tempKcjlDailyMapper;


	// 期末库存一致性测试方法
	public void postTest(String currentDate) {
		try {

			log.info("开始库存一致性检查，日期: {}", currentDate);

            // 查询temp_kcjl_daily_hy表中指定日期的数据（排除特定cpbh）
            List<kcjlDataDTO> kcHy = tempKcjlDailyHyMapper.getDataByEnddate(currentDate);

            // 查询temp_kcjl_daily表中指定日期的数据（排除特定cpbh）
            List<kcjlDataDTO> kc = tempKcjlDailyMapper.getDataByEnddate(currentDate);

            // 添加flag值
            kc.forEach(f -> f.setFlag(f.getBelongs().startsWith("FDS")?0:1));

            // 对kcHy按cpbh、place、belongs进行分组求和
            Map<String, Integer> kcHyMap = kcHy.stream()
                    .collect(Collectors.groupingBy(
                            // 复合键：用一个对象封装三个分组字段
                            item -> item.getCpbh()+"|"+item.getPlace()+"|"+item.getBelongs(),
                            // 对每个分组的sl求和
                            Collectors.summingInt(kcjlDataDTO::getSl)
                    ));
            kcHy = kcHyMap.keySet().stream()
                    .map(entry -> {
                        kcjlDataDTO kcjlDataDTO = new kcjlDataDTO();
                        String[] split = entry.split("\\|");
                        kcjlDataDTO.setCpbh(split[0]);
                        kcjlDataDTO.setPlace(split[1]);
                        kcjlDataDTO.setBelongs(split[2]);
                        kcjlDataDTO.setSl(kcHyMap.get(entry));
                        return kcjlDataDTO;
                    })
					.peek(f->f.setHySl(f.getSl()))
                    .collect(Collectors.toList());

            Map<String, kcjlDataDTO> mergedMap = new HashMap<>();
            //添加kc数据
            kc.forEach(f->{
                String key = f.getCpbh() + "|" + f.getPlace() + "|" + f.getBelongs();
                mergedMap.put(key,f);
            });
            kcHy.forEach(f->{
                String key = f.getCpbh() + "|" + f.getPlace() + "|" + f.getBelongs();
                if (mergedMap.containsKey(key)) {
                    // 如果键已存在，更新sl值
                    mergedMap.get(key).setHySl(f.getHySl());
                } else {
                    // 如果键不存在，添加新记录
                    mergedMap.put(key, f);
                }
            });

            ArrayList<kcjlDataDTO> mergedList = new ArrayList<>(mergedMap.values());
            List<kcjlDataDTO> result = mergedList.stream().filter(f -> f.getHySl() - f.getSl() != 0).collect(Collectors.toList());

            if(!result.isEmpty()){
                log.error("期末库存不一致，请检查！");
                log.error("不一致数据的数量：{}， 不一致的数据为{}",result.size(),result);
                throw new RuntimeException("期末库存不一致，请检查！");
            }

			log.info("期末库存一致性检查通过");
        } catch (Exception e) {
            log.error("期末库存一致性检查失败", e);
            throw new RuntimeException("期末库存一致性检查失败", e);
        }
    }

}